package com.ruge.test.springMVC.定时任务调度.quartz;

import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;

import java.util.Date;

/**
 * 爱丽丝、如歌  创建于 2018/6/22 15:26
 * 说明:  CronTrigger 的学习
 *              基于日历的作业调度器
 *                  不必像SimpleTrigger那样精确定位间隔时间
 *                      比SimpleTrigger更常用
 *     cron的表达式被用来配置CronTrigger实例。 cron的表达式是字符串，实际上是由七子表达式，
 *     描述个别细节的时间表。这些子表达式是分开的空白，代表：
 *           允许的特殊字符
 *      1.    , - * /           Seconds (秒)         ：可以用数字0－59 表示
 *      2.    , - * /           Minutes(分)          ：可以用数字0－59 表示
 *      3.    , - * /           Hours(时)             ：可以用数字0-23表示
 *      4.    , - * ? / L W C   Day-of-Month(天) ：可以用数字1-31 中的任一一个值，但要注意一些特别的月份
 *      5.    , - * /           Month(月)            ：可以用0-11 或用字符串  “JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV and DEC” 表示
 *      6.    , - * ? / L C #   Day-of-Week(每周)：可以用数字1-7表示（1 ＝ 星期日）或用字符口串“SUN, MON, TUE, WED, THU, FRI and SAT”表示
 *      7.    , - * /           Year (可选字段)
 *
 *      "*"     代表整个时间段.
 *      "/"     为特别单位，表示为“每”如“0/15”表示每隔15分钟执行一次,“0”表示为从“0”分开始, “3/20”表示表示每隔20分钟执行一次，“3”表示从第3分钟开始执行
 *      "?"     表示每月的某一天，或第周的某一天
 *      "L"     用于每月，或每周，表示为每月的最后一天，或每个月的最后星期几如“6L”表示“每月的最后一个星期五”
 *      "W"     表示为最近工作日，如“15W”放在每月（day-of-month）字段上表示为“到本月15日最近的工作日”
 *      "#"     是用来指定“的”每月第n个工作日,例 在每周（day-of-week）这个字段中内容为"6#3" or "FRI#3" 则表示“每月第三个星期五”
 */
public class HelloScheduler3 {
    public static void main(String[] args) throws SchedulerException, InterruptedException {
        JobDetail jobDetail = JobBuilder.newJob(HelloJobBase.class).withIdentity("my job1", "group1").usingJobData("message", "hello Myjob1").usingJobData("floatJobValue", 3.14F).build();
        Date date = new Date();
        /**
         * 每秒钟触发一次任务
         */
        CronTrigger trigger = (CronTrigger) TriggerBuilder.newTrigger().withSchedule(CronScheduleBuilder.cronSchedule("* * * * * ? *")).build();
        SchedulerFactory factory = new StdSchedulerFactory();
        Scheduler scheduler = factory.getScheduler();
        scheduler.start();
        /**
         * 预计开始时间
         */
        Date date1 = scheduler.scheduleJob(jobDetail, trigger);
        /**
         * scheduler 执行两秒后被挂起
         */
        Thread.sleep(2000);
        scheduler.standby();
        /**
         * scheduler 挂起三秒后继续执行
         */
        Thread.sleep(3000);
        scheduler.start();
        /**
         * scheduler 执行三秒后停止
         * shutdown(true)表示等待所有正在执行的任务执行完毕后关闭Scheduler
         * shutdown(false),即shutdown()表示直接关闭Scheduler
         */
        Thread.sleep(5000);
        scheduler.shutdown(false);
        scheduler.start();

    }
}
